<?php

namespace app\admin\model\system;

use think\Db;
use think\Model;

class TrusteeshipRule extends Model
{

    // 表名
    protected $name = 'trusteeship_rule';
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'int';
    // 定义时间戳字段名
    protected $createTime = 'createtime';
    protected $updateTime = 'updatetime';
    // 追加属性
    protected $append = [

    ];

    public function getOriginData()
    {
        return $this->origin;
    }


    public function getGenderList()
    {
        return ['1' => __('Male'), '0' => __('Female')];
    }

    public function getStatusList()
    {
        return ['normal' => __('Normal'), 'hidden' => __('Hidden')];
    }


    public function getPrevtimeTextAttr($value, $data)
    {
        $value = $value ? $value : ($data['prevtime'] ?? "");
        return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
    }

    public function getLogintimeTextAttr($value, $data)
    {
        $value = $value ? $value : ($data['logintime'] ?? "");
        return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
    }

    public function getJointimeTextAttr($value, $data)
    {
        $value = $value ? $value : ($data['jointime'] ?? "");
        return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
    }

    protected function setPrevtimeAttr($value)
    {
        return $value && !is_numeric($value) ? strtotime($value) : $value;
    }

    protected function setLogintimeAttr($value)
    {
        return $value && !is_numeric($value) ? strtotime($value) : $value;
    }

    protected function setJointimeAttr($value)
    {
        return $value && !is_numeric($value) ? strtotime($value) : $value;
    }

    protected function setBirthdayAttr($value)
    {
        return $value ? $value : null;
    }

    public function group()
    {
        return $this->belongsTo('UserGroup', 'group_id', 'id', [], 'LEFT')->setEagerlyType(0);
    }

    //计算法定节假日的日期和补班的日期
    public function get_legal_days($start_date, $end_date){
        //只能先根据开始时间 为基础查询出所有满足的法定节假日
        //然后在所有查询出来的结果中筛选没有超过结束日期的所有列表
        $start_date = date('Y-m-d',strtotime($start_date));
        $end_date = date('Y-m-d',strtotime($end_date));
        $where=[];
        $where['status'] = 1;
        $where['start_date'] = array('egt',$start_date);
        $content_cooper = Db::name('content_cooper')->where($where)->field('id,start_date,day_num,need_date')->select();
        $holiday = [];//节假日日期列表
        $weekday = [];//上班日期
        foreach($content_cooper as $k=>$v){
            if($v['start_date'] <= $end_date){
                $holiday[]=$v['start_date'];
            }
            $now_start_date = $v['start_date'];
            //循环放假天数
            if($v['day_num'] > 1){
                for($i=1;$i<$v['day_num'];$i++){
                    $now_date = strtotime($now_start_date) + 86400 * $i;
                    $days_date= date('Y-m-d',$now_date);
                    if($days_date <= $end_date){
                        //满足在结束时间之内的日期
                        $holiday[]=$days_date;
                    }
                }
            }
            //计算补班的日期列表
            $need_date = explode(',',$v['need_date']);
           // $need_date = json_decode($v['need_date'],true);
            foreach($need_date as $k1=>$v1){
                if( ($v1 >= $start_date) && ($v1 <= $end_date) ){
                    $weekday[]=$v1;
                }
            }
        }
        return $holiday;//节假日
    }
    public  function get_legal_week_days($start_date, $end_date){
        //只能先根据开始时间 为基础查询出所有满足的法定节假日
        //然后在所有查询出来的结果中筛选没有超过结束日期的所有列表
        $start_date = date('Y-m-d',strtotime($start_date));
        $end_date = date('Y-m-d',strtotime($end_date));
        $where=[];
        $where['status'] = 1;
        $where['start_date'] = array('egt',$start_date);
        $content_cooper = Db::name('content_cooper')->where($where)->field('id,start_date,day_num,need_date')->select();
        $weekday = [];//上班日期
        foreach($content_cooper as $k=>$v){
            //计算补班的日期列表
            $need_date = explode(',',$v['need_date']);
            foreach($need_date as $k1=>$v1){
                if( ($v1 >= $start_date) && ($v1 <= $end_date) ){
                    $weekday[]=$v1;
                }
            }
        }
        return $weekday;//上班列表
    }

    /* 计算一段时间内的除去节假日的工作日（扣公假）列表 */
    public function get_work_days($start_date, $end_date) {

        $data = array();
        if (strtotime($start_date) > strtotime($end_date)) list($start_date, $end_date) = array($end_date, $start_date);
        //先计算出这段时间内的天数
        $days = round(abs(strtotime($end_date) - strtotime($start_date))/86400) + 1;
        $data=[];//年月日格式 2009-10-16
        $start_time=strtotime($start_date);
        $week_date_arr = $this->get_weekend_days($start_date, $end_date);//周末的日期
     //   var_dump($week_date_arr);
        $holiday_date_arr = $this->get_legal_days($start_date, $end_date);//法定节假日的日期
    //    var_dump($holiday_date_arr);
        $holiday_arr = (array_values(array_unique( array_merge($week_date_arr , $holiday_date_arr) ) ) );//所有的法定节假日和周末的日期集合
        sort($holiday_arr);
        $start_date_old = $start_date;
        for($i=0;$i<$days;$i++){
            $start_date=date('Y-m-d',$start_time);
            if(!in_array($start_date,$holiday_arr)){
                $data[]=$start_date;
            }
            $start_time += 86400;
        }

        //在加上需要补的法定节假日的调休
        $get_legal_days = $this->get_legal_week_days($start_date_old, $end_date);//法定节假日的调休日期
        //var_dump($get_legal_days);
        $data = array_values ( array_unique( array_merge($data , $get_legal_days) ) );
        sort($data);
        return $data;
    }
    public /**
     * | @param char|int $start_date 一个有效的日期格式，例如：20091016，2009-10-16
     * | @param char|int $end_date 同上
     * | @param int $weekend_days 一周休息天数
     * | @return array
     * | array[total_days]  给定日期之间的总天数
     * | array[total_relax] 给定日期之间的周末天数
     */
    function get_weekend_days($start_date, $end_date, $weekend_days=2) {

        $data = array();
        $start_date = strtotime($start_date);$end_date = strtotime($end_date);
        $weekend_day = [];//上班日期
        for($i=$start_date; $i<=$end_date; $i+=86400){
            if(date('w', $i) == 6 || date('w', $i) == 0) {
                $weekend_day[] = date('Y-m-d', $i);
            }
        }

//        $start_reduce = $end_add = 0;
//        $start_N      = date('N',strtotime($start_date));
//        $start_reduce = ($start_N == 7) ? 1 : 0;
//
//        $end_N = date('N',strtotime($end_date));
//
//        // 进行单、双休判断，默认按单休计算
//        $weekend_days = intval($weekend_days);
//        switch ($weekend_days)
//        {
//            case 2:
//                in_array($end_N,array(6,7)) && $end_add = ($end_N == 7) ? 2 : 1;
//                break;
//            case 1:
//            default:
//                $end_add = ($end_N == 7) ? 1 : 0;
//                break;
//        }
//
//        $days = round(abs(strtotime($end_date) - strtotime($start_date))/86400) + 1;
//        $data['total_days'] = $days;
//        $data['total_relax'] = floor(($days + $start_N - 1 - $end_N) / 7) * $weekend_days - $start_reduce + $end_add;

        return $weekend_day;
    }

    /* 计算一段时间内的除去节假日的工作日（扣公假）列表 */
    public function get_week_work_days($start_date, $end_date) {

        $data = array();
        if (strtotime($start_date) > strtotime($end_date)) list($start_date, $end_date) = array($end_date, $start_date);
        //先计算出这段时间内的天数
        $days = round(abs(strtotime($end_date) - strtotime($start_date))/86400) + 1;
        $data=[];//年月日格式 2009-10-16
        $start_time=strtotime($start_date);
        $holiday_arr = $week_date_arr = $this->get_weekend_days($start_date, $end_date);//周末的日期
        sort($holiday_arr);
        $start_date_old = $start_date;
        for($i=0;$i<$days;$i++){
            $start_date=date('Y-m-d',$start_time);
            if(!in_array($start_date,$holiday_arr)){
                $data[]=$start_date;
            }
            $start_time += 86400;
        }
//        //在加上需要补的法定节假日的调休
//        $get_legal_days = $this->get_legal_week_days($start_date_old, $end_date);//法定节假日的调休日期
//        //var_dump($get_legal_days);
//        $data = array_values ( array_unique( array_merge($data , $get_legal_days) ) );
//        sort($data);
//        var_dump($data);exit;
        return $holiday_arr;
    }
}
